Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - zbirka nalog...
Tekmovanja...
Tekmovanja - dopolni...
Tekmovanja - Parsons...
Tekmovanja - popravi...
Starejši - učbenik
Funkcije
If stavek
Izpisi
Množice
Nizi
Pisanje in popravljanje programa
Seznami in nizi
Slovarji
Spoznajmo Python
Uvod v funkcije
Zanka for
Zanka while
If stavek

If stavek


Logični izrazi - razlaga

Če hočemo dobro razumeti delovanje pogojnih stavkov, je dobro, da najprej razumemo, kaj so logični izrazi. Logični izrazi imajo lahko le dve vrednosti. Lahko so ali resnični (v Pythonu to označujemo s True) ali pa neresnični (v Pythonu to označujemo s False). Vrednosti True in False sta tipa boolean (Boolovi vrednosti).

Poglejmo si nekaj primerov.

>>> 3 > 1
True

>>> 4 <= 4
True

>>> 5 == 5
True

>>> 7 < 6
False

>>> a = 10
>>> b = 1
>>> a > b
True

Tako vidimo, da ima vsak izmed izrazov lahko le eno izmed dveh vrednosti (True ali False). Logične izraze tvorimo s pomočjo primerjalnih operatorjev kot so je enako (==), ni enako (!=), večje (>), manjše (<), večje ali enako (>=) in manjše ali enako (<=).

Prav tako pa vrednost True ali False predstavlja kakšen ne matematičen izraz ali funkcija. To vidimo v spodnjem primeru za vsebovanost v nizu, ki jih bomo spoznali kasneje v sklopu o nizih. Tudi funkcija isinstance nam vrne Boolovo vrednost.

>>> 'a' in 'rabarbara'
True

>>> isinstance('kolo', str)
True

To znanje nam bo prišlo prav kasneje pri razumevanju pogojnih stavkov.

Več logičnih izrazov oz. izrazov, ki predstavljajo logični vrednosti True ali False, pa lahko med seboj povežemo s pomočjo logičnih operatorjev. Najbolj znanih so in (and), ali (or) in ne (not).

Poglejmo si nekaj primerov.

>>> (3 < 4) and (4 < 5)
True

>>> True and False
False

>>> ('a' in 'rabarbara') or (5 < 1)
True

>>> not True
False

>>> (True and True) or (True and False)
True

Vidimo da, naprimer operator and vrne True le, če sta obe vrednosti enaki True. Operator or pa vrne True, če je vsaj ena vrednost enaka True.


Logični izrazi - naloge

Poglejte si še naslednje primere in poskušajte razumeti, zakaj imajo izrazi take vrednosti, kot jih imajo.

1. podnaloga

Razmislite, kakšno vrednost ima izraz in jo napišite pod izraz.

((3 == 3) and (4 != 5)) and (5 <= 4)

Uradna rešitev

((3 == 3) and (4 != 5)) and (5 <= 4)
True

2. podnaloga

Razmislite, kakšno vrednost ima izraz in jo napišite pod izraz.

not False

Uradna rešitev

not False
True

3. podnaloga

Razmislite, kakšno vrednost ima izraz in jo napišite pod izraz.

(not False and not False) and (True or False)

Uradna rešitev

(not False and not False) and (True or False)
True

4. podnaloga

Razmislite, kakšno vrednost ima izraz in jo napišite pod izraz.

('a' in 'rabarbara') and isinstance(3, str)

Uradna rešitev

('a' in 'rabarbara') and isinstance(3, str)
False

5. podnaloga

Sestavite funkcijo stevilo_vnukov(st), ki kot argument st sprejme število vnukov in vrne True, če je to število enako $3$ in False, če to število ni enako $3$.

Primer:

>>> stevilo_vnukov(23)
False

Uradna rešitev

def stevilo_vnukov(st):
    """Funkcija vrne True, če je število st enako 3, in False sicer."""
    return st == 3

Pogojni stavek - razlaga

V Pythonu pogojni stavek izgleda nekako takole:

if pogoj:
    ukaz1A
    ukaz1B
    ...
else:
    ukaz2A
    ukaz2B
    ...

Pogojni stavek delimo na dva bloka. Prvi blok z delom if se izvede, kadar je pogoj izpolnjen (ko ima pogoj vrednost True se izvedejo ukazi ukaz1A, ukaz1B, ...). Če pogoj ni izpolnjen, se izvede drugi blog z delom else (če ima pogoj vrednost False, se izvedejo ukaziukaz2A,ukaz2B, ...). Ukazi morajo biti obvezno zamaknjeni vsi enako in bolj zamaknjeni od vrstice z delomif, da urejevalnik ve, kam kaj spada. Oba bloka se ne moreta izvesti. Če se izvede prvi blok, drugega preskočimo, če pa preskočimo prvi blok, se avtomatično izvede drugi blok. Paziti moramo še na dvopičje za pogojem in dvopičje zaelse`.

Poglejmo si primer. Vsak mesec dobimo $1000$ evrov plače. Imamo funkcijo koliko_nakazali(placa), ki kot argument sprejme število placa, ki je enako znesku nakazanemu na naš bančni račun.

def koliko_nakazali(placa):
    """Funkcija sprejme znesek nakazila in nam vrne niz, v katerem nam pove,
    ali smo dobili zadosten znesek."""
    if placa < 1000:
        niz =  'Nakazilo je bilo prenizko!'
    else:
        niz = 'Nakazilo je bilo ustrezno.'
    return niz

>>> koliko_nakazali(1000)
'Nakazilo je bilo ustrezno'

>>> koliko_nakazali(234)
'Nakazilo je bilo prenizko!'

Ker v prvem primeru pogoj ni bil izpolnjen, se je izvedel drugi blok ukazov in funkcija je vrnila niz 'Nakazilo je bilo ustrezno.'. V drugem primeru je bil pogoj izpolnjen, zato se je izvedel le prvi blok ukazov in funkcija je vrnila niz 'Nakazilo je bilo prenizko!'.

Za pogojni stavek ni nujno, da vedno sestoji iz obeh blokov. Prvi blok je vedno obvezen, torej tisti del, kjer piše if in za tem pogoj, ter vsaj en ukaz, ki mu sledi, če je pogoj izpolnjen. Za drugi del ni nujno, da se pojavi. Tako lahko isto funkcijo napišemo na način, da nas opozori le, če je bilo nakazilo prenizko.

def koliko_nakazali(placa):
    """Funkcija sprejme znesek nakazila in nam vrne niz, v katerem nam pove,
    če nismo dobili zadostnega zneska."""
    niz = ''
    if placa < 1000:
        niz =  'Nakazilo je bilo prenizko!'
    return niz

>>> koliko_nakazali(1000)
''

>>> koliko_nakazali(234)
'Nakazilo je bilo prenizko!'

Pogojni stavek - naloge

1. podnaloga

Naslednja koda vsebuje, kar se zamikov tiče, cel kup napak.

    x = int(input('x: '))
    y = int(input('y: '))
    if x == 3 and y == 4:
        print("x je 3")
           print("y je morda 4, vem pa ne")
    if x > 2 and y < 5:
    print("x > 2")
    print("y < 5")
    if x < 4 and y > 3:
        print("x < 4")
            print("y > 3")

Popravite napake! Stavkov samih ne spreminjajte, le njihove zamike. Popravki morajo biti taki, da so izpisi smiselni.

Uradna rešitev

x = int(input('x: '))
y = int(input('y: '))
if x == 3 and y == 4:
    print("x je 3")
print("y je morda 4, vem pa ne")
if x > 2 and y < 5:
    print("x > 2")
    print("y < 5")
if x < 4 and y > 3:
    print("x < 4")
    print("y > 3")

2. podnaloga

Janezek nabira gobe. Ker ga je babica dobro podučila, da se gob, ki jih ne poznaš, ne nabira, nabira le jurčke in lisičke. Jurčka lahko na tržnici proda za $5$ evrov, lisičko pa za $1$ evro. Ker ima Janezek slab spomin, cene kar naprej pozablja. Napišite funkcijo cena_gob(vrsta, st), ki sprejme vrsto gobe in število gob ter vrne ceno vseh gob skupaj. Če goba ni ne lisička ne jurček, naj funkcija vrne niz 'Ne prodajaj!'.

>>> cena_gob('jurcek', 2)
10
>>> cena_gob('lisicka', 7)
7
>>> cena_gob('musnica', 15)
'Ne prodajaj!'

Uradna rešitev

def cena_gob(vrsta, st):
    """Sprejme vrsto gobe in število gob ter vrne ceno vseh gob skupaj.
    Če Janezek gobe ne pozna, funkcija vrne niz »Ne prodajaj!«."""
    if (vrsta != 'jurcek') and (vrsta != 'lisicka'):
        return 'Ne prodajaj!'
    if vrsta == 'jurcek':
        cena = 5
    else:
        cena = 1
    return cena * st

3. podnaloga

Napišite funkcijo kaksno_st(st), ki sprejme število st. Če je število sodo, funkcija vrne niz 'sodo', če pa je liho, vrne niz 'liho'.

>>> kaksno_st(3)
liho
>>> kaksno_st(2)
sodo

Uradna rešitev

def kaksno_st(st):
    """Sprejme število `st` in vrne niz 'sodo', če je število sodo, sicer pa niz 'liho'."""
    if st % 2 == 0:
        niz = 'sodo'
    else:
        niz = 'liho'
    return niz

4. podnaloga

Ugodna sobna temperatura se giblje nekje med $22$ in $24$ stopinjami Celzija. Napišite funkcijo temperatura(izmerjena), ki sprejme izmerjeno temperaturo izmerjena in vrne niz 'ugodna', če je temperatura med $22$ in $24$ stopinj, sicer pa vrne niz 'neugodna'.

>>> temperatura(22)
ugodna
>>> temperatura(29)
neugodna

Uradna rešitev

def temperatura(izmerjena):
    """Sprejme temperaturo izmerjena in vrne niz 'ugodna', če je
    izmerjena med 22 in 24, sicer vrne niz 'neugodna'."""
    if 22 <= izmerjena <= 24:
        niz = 'ugodna'
    else:
        niz = 'neugodna'
    return niz

Gnezdenje pogojnih stavkov - razlaga

Včasih nas ne zanima le, če je goba lisička ali jurček. Babica je Janezka naučila prepoznati še mušnico in veliki dežnik. Veliki dežniki stanejo $2$ evra, mušnice pa so strupene, zato si je napisal naslednji program.

def cena_gob(vrsta, st):
    """Sprejme vrsto gobe in število gob ter vrne ceno vseh gob skupaj. Če je vrsta
    gobe mušnica, vrne niz 'Goba je strupena!' Če Janezek gobe ne pozna, funkcija vrne
    niz 'Ne prodajaj!'"""
    if vrsta == 'jurcek':
        cena = 5
    else:
        if vrsta == 'lisicka':
            cena = 1
        else:
            if vrsta == 'velikideznik':
                cena = 2
            else:
                if vrsta == 'musnica':
                    return 'Goba je strupena!'
                else:
                    return 'Ne prodajaj!'
    return cena * st

Kot lahko vidimo, se da znotraj enega pogojnega stavka uporabiti še drugega in tako naprej. Pri tem moramo biti še vseeno pozorni na pravilno zamikanje. Kar je znotraj enega bloka, mora biti zamaknjeno. Če se znotraj enega bloka pojavi nov blok, je ta ponovno še bolj zamaknjen.

Ker pa se tak način pisanja pojavlja pogosto, se da gnezdenje pogojnih stavkov napisati še na en način. Pri naslednji funkciji, ki dela enako kot prejšnja, bodite pozorni na uporabo elif.

def cenaGob(vrsta, st):
    """Sprejme vrsto gobe in število gob ter vrne ceno vseh gob skupaj. Če je vrsta
    gobe mušnica, vrne niz 'Goba je strupena!' Če Janezek gobe ne pozna, funkcija vrne
    niz 'Ne prodajaj!'"""
    if vrsta == 'jurcek':
        cena = 5
    elif vrsta == 'lisicka':
        cena = 1
    elif vrsta == 'velikideznik':
        cena = 2
    elif vrsta == 'musnica':
        return 'Goba je strupena!'
    else:
        return 'Ne prodajaj!'
    return cena * st

Z uporabo elif se torej združita else prejšnjega pogojnega stavka in if naslednjega pogojnega stavka znotraj prejšnjega else. Z uporabo tega pripomočka se izognemo prekomernemu zamikanju kode. Pri uporabi elif se izvede blok pri prvemu pogoju, ki je zadoščen, ostale bloke pa se preskoči.


Gnezdenje pogojnih stavkov - naloge

1. podnaloga

Ugodna sobna temperatura se giblje nekje med $22$ in $24$ stopinjami Celzija. Napišite funkicijo temperatura(izmerjena), ki sprejme izmerjeno temperaturo izmerjena in vrne niz 'ugodno', če je temperatura med $22$ in $24$ stopinjami, 'prevroče', če je temperatura nad $24$ stopinjami in 'premrzlo', če je temperatura pod $22$ dtopinjami.

>>> temperatura(22)
'ugodno'
>>> temperatura(29)
'prevroče'

Uradna rešitev

def temperatura(izmerjena):
    """Sprejme temperaturo izmerjena in vrne niz 'ugodno', če je
    temperatura med 22 in 24, niz 'prevroče', če je nad 24, in niz 'premrzlo',
    če je temperatura pod 22-imi stopinjami."""
    if izmerjena > 24:
        niz = 'prevroče'
    elif izmerjena >= 22:
        niz = 'ugodno'
    else:
        niz = 'premrzlo'
    return niz

2. podnaloga

Napišite funkcijo kaksno_st(st), ki sprejme število st. Če je število deljivo z dve, funkcija vrne niz '2', če je število deljivo s tri funkcija vrne niz '3', če pa je število deljivo z dve in s tri, funkcija vrne niz '2 in 3'. Če število st ni deljivo z nobenim od teh dveh števil, funkcija vrne niz '1'.

>>> kaksno_st(10)
'2'
>>> kaksno_st(6)
'2 in 3'

Uradna rešitev

def kaksno_st(st):
    """Sprejme število st in vrne niz '2 in 3', če je število deljivo s 6, ali
    niz '2' če je deljivo samo z 2, ne pa tudi s 3, ali niz '3', če je deljivo
    samo s 3, ne pa tudi z 2, sicer vrne '1'."""
    if (st % 2 == 0) and (st % 3 == 0):
        niz = '2 in 3'
    elif st % 2 == 0:
        niz = '2'
    elif st % 3 == 0:
        niz = '3'
    else:
        niz = '1'
    return niz
Mesto objave ob koncu projekta 15.9.2018